/*
 * Copyright 2011-2022 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0.
 * See `LICENSE` in the project root for license information.
 */

package me.ijleex.platform.system.menu.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import me.ijleex.platform.framework.mybatis.mapper.MyBatisMapper;
import me.ijleex.platform.system.admin.entity.Admin;
import me.ijleex.platform.system.menu.entity.AdminMenu;
import me.ijleex.platform.system.menu.entity.Menu;
import me.ijleex.platform.system.role.entity.Role;
import me.ijleex.platform.system.role.mapper.RoleMenuMapper;

/**
 * 菜单 数据层
 *
 * @author liym
 * @since 2019-03-14 12:28:19 By 'codegen'
 */
@Mapper
public interface MenuMapper extends MyBatisMapper<Menu> {

    /**
     * 根据管理员id、系统菜单唯一标识 systemId，查询菜单信息
     *
     * @param object 查询对象，必须包含 adminId 和 systemId
     * @return 菜单信息，如果菜单不存在或管理员没有权限访问指定的菜单，则返回 null
     * @see #selectMenuByAdmin(Admin)
     * @since 2017-02-20 11:09:56
     */
    Menu selectRootMenuByAdmin(AdminMenu object);

    /**
     * 根据菜单 id 查询子菜单，按 sort 排序，用于前端展示，删除检查等
     *
     * @param id 菜单 ID
     * @return 指定 id 的菜单的子菜单列表
     * @since 2016-08-29 18:02:34
     */
    List<Menu> selectSubMenuById(Long id);

    /**
     * 查询已授权给指定管理员的菜单的列表
     *
     * @param user 管理员信息，必须包含 id
     * @return 已授权给指定管理员的菜单的列表
     * @see #selectMenuIdByAdminId(Long)
     * @since 2016-08-15 14:55:56
     */
    List<AdminMenu> selectMenuByAdmin(Admin user);

    /**
     * 查询已授权给指定管理员的菜单（ID）的列表
     *
     * @param adminId 管理员 ID
     * @return 已授权给指定管理员的菜单（ID）的列表
     * @see #selectMenuByAdmin(Admin)
     * @since 2019-03-15 11:46
     */
    List<Long> selectMenuIdByAdminId(Long adminId);

    /**
     * 查询已授权给指定角色的菜单的列表
     *
     * @param object 角色信息，必须包含 id
     * @return 已授权给指定角色的菜单的列表
     * @see RoleMenuMapper#selectMenuIdByRoleId(Long)
     * @since 2016-08-23 16:45:36
     */
    List<AdminMenu> selectMenuByRole(Role object);

    /**
     * 根据菜单 ID，查询所有上级菜单（MySQL/Oracle 递归查询）
     *
     * <p>MySQL：http://blog.sina.com.cn/s/blog_8edc37a80101ij6c.html</p>
     *
     * @param id 菜单 ID
     * @return 指定菜单（ID）的所有上级菜单
     * @since 2016-08-25 11:02:13
     */
    List<Menu> selectParentMenuById(Long id);

    /**
     * 根据菜单 ID，查询所有下级菜单
     *
     * @param id 菜单 ID
     * @return 指定菜单（ID）的所有下级菜单 ID
     * @since 2019-12-30 23:02
     */
    List<Long> selectSubIdsById(Long id);

}
